#include <bits/stdc++.h>
#define ll long long
using namespace std;

const int Maxn=1e5+7;
int n,Q,fa[Maxn];
int a[Maxn];
int deg[Maxn];
vector<int>e[Maxn];
int f[Maxn][20],dep[Maxn],dfn[Maxn],tot,id[Maxn];
int ans[Maxn],sz[Maxn];
bool vis[Maxn],wh[Maxn];

set<int>s;

void dfs(int u){
    dfn[u]=++tot;id[tot]=u;
    dep[u]=dep[fa[u]]+1;
    f[u][0]=fa[u];
    for(int i=1;i<20;i++) f[u][i]=f[f[u][i-1]][i-1];
    sz[u]=1;
    for(auto v:e[u]) dfs(v),sz[u]+=sz[v];
}
inline int getlca(int x,int y){
    if(dep[x]<dep[y]) swap(x,y);
    for(int i=19;~i;i--) if(dep[f[x][i]]>=dep[y]) x=f[x][i];
    if(x==y) return x;
    for(int i=19;~i;i--) if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
    return f[x][0];
}

class BIT{
    #define lowbit(x) (x&-x)
    public:
        inline void init(int n){sz=n;}
        inline void add(int x,int k){
            while(x<=sz) tr[x]+=k,x+=lowbit(x);
        }
        inline int query(int x){
            if(!x) return 0;
            int ret=0;
            while(x) ret+=tr[x],x-=lowbit(x);
            return ret;
        }
    private:
        int tr[Maxn];
        int sz;
}t;
inline bool check(int l,int r){
    // int tt=0;
    // for(int i=l;i<=r;i++){
    //     auto it=s.lower_bound(id[i]);
    //     if(it!=s.end() and *it==id[i]) return 1;
    // }
    // return 0;
    return (t.query(r)-t.query(l-1));
}

struct ques{
    int l,r,id;
}q[Maxn];
int sq;

inline void add(int x){
    // cout<<"mt "<<a[x]<<endl;
    x=a[x];vis[x]=1;
    auto it=s.lower_bound(dfn[x]);
    if(it!=s.end()){
        int p1=*it;
        int pp=dfn[getlca(id[p1],x)];
        s.insert(pp);
        if(!wh[pp]) t.add(pp,1),wh[pp]=1;
    }
    if(it!=s.begin()){
        it--;
        int p2=*it;
        int pp=dfn[getlca(id[p2],x)];
        s.insert(pp);
        if(!wh[pp]) t.add(pp,1),wh[pp]=1;
    }
    s.insert(dfn[x]);
    if(!wh[dfn[x]]) t.add(dfn[x],1),wh[dfn[x]]=1;
}
inline void del(int x){
    // return ;
    // cout<<"et "<<a[x]<<" "<<t.query(n)<<endl; 
    x=a[x];vis[x]=0;
    int c=0;
    for(auto v:e[x]){
        if(check(dfn[v],dfn[v]+sz[v]-1)){
            c++;
            if(c>=2) break;
        }
    }
    if(c>=2) return ;
    s.erase(dfn[x]);
    if(wh[dfn[x]]) t.add(dfn[x],-1);
    wh[dfn[x]]=0;
    
    if(c==1) return ;
    auto it=s.lower_bound(dfn[x]);
    
    if(it!=s.begin()){
        it--;
        
        int now=*it;
        // cout<<"mm "<<now<<endl;
        
        int uu=id[now];
        if(getlca(uu,x)!=uu){
            now=*s.begin();
            uu=id[now];
            if(getlca(uu,x)!=uu) return ;
        }
        if(vis[uu]) return ;
        c=0;
        for(auto v:e[uu]){
            if(check(dfn[v],dfn[v]+sz[v]-1)){
                c++;
                if(c>=2) break;
            }
        }
        if(c>=2) return ;
        if(wh[now])t.add(now,-1);
        s.erase(now);
        wh[now]=0;
    }
}

int main(){
    freopen("escape.in","r",stdin);
    freopen("escape.out","w",stdout);
    scanf("%d%d",&n,&Q);
    t.init(n+5);
    sq=sqrt(n);
    for(int i=2;i<=n;i++) scanf("%d",&fa[i]),e[fa[i]].emplace_back(i);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);

    dfs(1);

    for(int i=1;i<=Q;i++){
        scanf("%d%d",&q[i].l,&q[i].r);q[i].id=i;
    }
    // sort(q+1,q+Q+1,[](ques x,ques y){
    //     return x.l/sq==y.l/sq?x.r<y.r:x.l<y.l;
    // });
    int l=1,r=0;
    for(int i=1;i<=Q;i++){
        // while(r<q[i].r) add(++r);
        // while(r>q[i].r) del(r--);
        // while(l<q[i].l) del(l++);
        // while(l>q[i].l) add(--l);
        // cout<<"hel "<<l<<" "<<r<<endl;
        s.clear();
        for(int j=q[i].l;j<=q[i].r;j++) add(j);
        // for(int j=1;j<q[i].l;j++) del(j);
        ans[q[i].id]=s.size();
    }
    for(int i=1;i<=Q;i++) printf("%d\n",ans[i]);

    // system("pause");
    return 0;
}
/*
5 2
1 1 3 3
1 2 3 4 5
3 5
2 4

5 2 
1 1 1 1 
5 4 3 2 1
4 4 
2 4
*/